package Datos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.CallableStatement;
import java.util.*;

public class Orden {
	Sesion oSesion;
	
	public Orden() {};
	
	public int Add(Entidades.Orden item) throws Exception{
		try{
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.OrdenAdd(?,?,?,?,?,?,?,?,?,?,?,?)}";
		CallableStatement cs =oCnn.prepareCall(storedProcedure);
		poneDatos(item,cs);
		boolean pipi = cs.execute();
		int numero = 0;
		if (pipi) numero = 1;
		return numero;
		
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
			   return -1;
		}
	}
	public void Update(Entidades.Orden item) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.OrdenUpdate(?,?,?,?,?,?,?,?,?,?,?,?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			poneDatos(item,cs);
			boolean pipi = cs.execute();
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Delete(String id) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.OrdenDelete(?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			cs.setString("mIdComitente", id);

			boolean pipi = cs.execute();
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public List GetOne(String id) throws Exception{
		Statement stmt = null;   //
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.OrdenGetOne(?)}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		cs.setString("mIdOrden", id);
		rs = cs.executeQuery();
		return sacaDatos(rs);
	}
	public List GetAll() throws Exception{
		Statement stmt = null;   //
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.OrdenGetAll()}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		rs = cs.executeQuery();
		return sacaDatos(rs);
	}
	public List Consulta(String id) throws Exception{
		oSesion = new Sesion();
		ResultSet rs = null;	//
		String sql = id + ";";
		rs = oSesion.getSesion().executeQuery(sql);
		return sacaDatos(rs);
	}
	public List Primero() throws Exception{
		return Trae("FIRST");
	}
	public List Siguiente() throws Exception{
		return Trae("NEXT");
	}
	public List Anterior() throws Exception{
		return Trae("PREV");
	}
	public List Ultimo() throws Exception{
		return Trae("LAST");
	}
	public void Abrir() throws Exception{
		oSesion = new Sesion();
		try{
			String sql = "HANDLER `orden` OPEN";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Cerrar() throws Exception{
		try{
			String sql = "HANDLER `orden` CLOSE";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public List Trae(String condicion) throws Exception{
		ResultSet rs = null;	//
		String sql = "HANDLER `orden` READ `PRIMARY` " + condicion + "";
		rs = oSesion.getSesion().executeQuery(sql);  //
		return sacaDatos(rs);
	}
	private void poneDatos(Entidades.Orden item, CallableStatement cs){
		try{
			cs.setDouble("mIdOrden", item.getIdOrden());
			cs.setDouble("mNroOrden", item.getNroOrden());
			cs.setDate("mFecActivacion",  new java.sql.Date(item.getFchActivacion().getTime()));
			cs.setDate("mFecCreacion",  new java.sql.Date(item.getFchCreacion().getTime()));
			cs.setInt("mPlazoVigencia",item.getPlazoVigencia());
			cs.setInt("mIdEstadoOrden",item.getEstadoOrden().getIdEstadoOrden());
			cs.setString("mIdComitente",item.getComitente().getIdComitente());
			cs.setInt("mIdPersonal",item.getPersonal().getIdPersonal());
			cs.setInt("mIdSegmento",item.getSegmento().getIdSegmento());
			cs.setNull("mMonto", 0);
			cs.setFloat("mTasa",item.getTasa());
			cs.setNull("mPlazoCPD",0);
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	private List sacaDatos(ResultSet rs){
		List oDatos = new ArrayList();
		try{
			while(rs.next()){
				
				//creo el objeto EstadoOrden de la Orden
				List oEstadoOrdenes = new ArrayList();
				Entidades.EstadoOrden oEstadoOrden = null;
				oEstadoOrdenes = new Datos.EstadoOrden().GetOne(rs.getInt(6));
				while(!oEstadoOrdenes.isEmpty()){
					oEstadoOrden = (Entidades.EstadoOrden) oEstadoOrdenes.remove(0);
				}
				
				//creo el objeto Comitente de la Orden
				List oComitentes = new ArrayList();
				Entidades.Comitente oComitente = null;
				oComitentes = new Datos.Comitente().GetOne(rs.getString(7));
				while(!oComitentes.isEmpty()){
					oComitente = (Entidades.Comitente) oComitentes.remove(0);
				}
				
				//creo el objeto Personal de la Orden
				List oPersonal = new ArrayList();
				Entidades.Personal oPersona = null;
				oPersonal = new Datos.Personal().GetOne(rs.getInt(8));
				while(!oPersonal.isEmpty()){
					oPersona = (Entidades.Personal) oPersonal.remove(0);
				}

				//creo el objeto Segmento de la Orden
				List oSegmentos = new ArrayList();
				Entidades.Segmento oSegmento = null;
				oSegmentos = new Datos.Segmento().GetOne(rs.getInt(9));
				while(!oSegmentos.isEmpty()){
					oSegmento = (Entidades.Segmento) oSegmentos.remove(0);
				}
				
				rs.getInt(12);
				if (rs.wasNull()){
					//creo el array DetalleOrdenVenta
					List oDetallesOrdenVenta = new ArrayList();
					Entidades.DetalleOrdenVenta oDetalleOrdenVenta = null;
					oDetallesOrdenVenta = new Datos.DetalleOrdenVenta().Consulta(rs.getInt(1));
					if (oDetallesOrdenVenta.isEmpty()){
						oDetallesOrdenVenta = null;
						//oDetalleOrdenVenta = (Entidades.DetalleOrdenVenta) oDetallesOrdenVenta.remove(0);
					}
					oDatos = new Datos.OrdenVenta().sacaDatos(rs, oEstadoOrden, oComitente, oPersona, oSegmento, oDetallesOrdenVenta, oDatos);
				} else {
					oDatos = new Datos.OrdenCompra().sacaDatos(rs, oEstadoOrden, oComitente, oPersona, oSegmento, oDatos);
				}
			}
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
		return oDatos;
	}

}
